# -*- coding:utf-8 -*-
# @Time: 2020/7/16 16:54
# @Author: liupengfei
# @File: SendSms.py
import json
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
# 导入对应产品模块的client models。
from tencentcloud.sms.v20190711 import sms_client, models

# 导入可选配置类
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile

from django.conf import settings
from .exceptions import CustomError


class SMS:
    def __init__(self):
        self.secretId = settings.TENCENT_CLOUD['TENCENT_SECRETID']
        self.secretKey = settings.TENCENT_CLOUD['TENCENT_SECRETKEY']
        self.cred = credential.Credential(self.secretId, self.secretKey)
        # 实例化一个http选项，可选的，没有特殊需求可以跳过。
        self.httpProfile = HttpProfile()
        self.httpProfile.reqMethod = "POST"  # post请求(默认为post请求)
        self.httpProfile.reqTimeout = 30  # 请求超时时间，单位为秒(默认60秒)
        self.httpProfile.endpoint = "sms.tencentcloudapi.com"  # 指定接入地域域名(默认就近接入)

        self.clientProfile = ClientProfile()
        self.clientProfile.signMethod = "TC3-HMAC-SHA256"  # 指定签名算法
        self.clientProfile.language = "en-US"
        self.clientProfile.httpProfile = self.httpProfile
        # 实例化要请求产品(以sms为例)的client对象
        # 第二个参数是地域信息，可以直接填写字符串ap-guangzhou，或者引用预设的常量
        self.client = sms_client.SmsClient(self.cred, "ap-guangzhou", self.clientProfile)
        # 实例化一个请求对象，根据调用的接口和实际情况，可以进一步设置请求参数
        self.req = models.SendSmsRequest()
        # 短信应用ID: 短信SdkAppid在 [短信控制台] 添加应用后生成的实际SdkAppid，示例如1400006666  SDKAPPID
        self.req.SmsSdkAppid = settings.TENCENT_CLOUD['SDKAPPID']
        # 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，签名信息可登录 [短信控制台] 查看  SIGN
        self.req.Sign = settings.TENCENT_CLOUD['SIGN']

    def send(self, mobile, vcode):
        try:
            # 下发手机号码，采用 e.164 标准，+[国家或地区码][手机号]
            # 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号
            self.req.PhoneNumberSet = [mobile]
            # 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看
            self.req.TemplateID = settings.TENCENT_CLOUD['TENCENT_SMS_TEMPLATE']
            # 模板参数: 若无模板参数，则设置为空
            self.req.TemplateParamSet = [vcode]   #对应的模板里面的参数：验证码为：{1}，5分钟内有效，若非本人操作，请勿泄露。

            # 通过client对象调用DescribeInstances方法发起请求。注意请求方法名与请求对象是对应的。
            # 返回的resp是一个DescribeInstancesResponse类的实例，与请求对象对应。
            resp = self.client.SendSms(self.req)
            # 输出json格式的字符串回包
            return json.loads(resp.to_json_string(indent=2))['SendStatusSet'][0]
        except TencentCloudSDKException as err:
            raise CustomError('验证码发送失败')
